package com.example.demo.schedule;

import com.example.demo.globalvar.LocalCache;
import com.example.demo.mapper.FileMetadataMapper;
import com.example.demo.model.dataobject.FileMetadataDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Component
@Slf4j
public class FileUpdateIndexesSchedule {
    @Resource
    private FileMetadataMapper fileMetadataMapper;

    @Scheduled(cron = "0 */10 * * * *")
    public void updateIndexes() {
        AtomicInteger count = new AtomicInteger();
        List<FileMetadataDO> fileMetadataDOS = new ArrayList<>(1000);
        log.info("新增文件更新索引");

        // 如果新增本地缓存不为空执行插入
        if (!LocalCache.ADD_LOCAL_CACHE.asMap().isEmpty()) {
            LocalCache.ADD_LOCAL_CACHE.asMap().forEach((k, v) -> {
                fileMetadataDOS.add(v);
                count.getAndIncrement();
                // 每1000条数据插入一次
                if (count.get() % 1000 == 0) {
                    fileMetadataMapper.insertBatch(fileMetadataDOS);
                    fileMetadataDOS.clear();
                    System.out.println("插入到第" + count.get() / 1000 + "次数据");
                }
            });
            // 清空缓存
            LocalCache.ADD_LOCAL_CACHE.invalidateAll();
            // 插入剩余的数据
            fileMetadataMapper.insertBatch(fileMetadataDOS);
            System.out.println("LL这是插入数据库的数据：" + fileMetadataDOS);
            fileMetadataDOS.clear();
        }

        // 重置计数器
        count.set(0);
        log.info("删除文件更新索引");

        // 如果删除本地缓存不为空执行删除
        if (!LocalCache.ADD_LOCAL_CACHE.asMap().isEmpty()) {
            LocalCache.DELETE_LOCAL_CACHE.asMap().forEach((k, v) -> {
                fileMetadataDOS.add(v);
                count.getAndIncrement();

                if (count.get() % 1000 == 0) {
                    fileMetadataMapper.deleteFileMetadata(fileMetadataDOS);
                    fileMetadataDOS.clear();
                    System.out.println("删除到第" + count.get() / 1000 + "次数据");
                }
            });
            // 清空缓存
            LocalCache.DELETE_LOCAL_CACHE.invalidateAll();
            // 插入剩余的数据
            fileMetadataMapper.deleteFileMetadata(fileMetadataDOS);
            System.out.println("XX这是删除数据库的数据：" + fileMetadataDOS);
            fileMetadataDOS.clear();
        }

        log.info("更新索引完成");
    }
}
